
import java.io.IOException;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import messages.*;

public class DestinataireC {

	public static final int DEST_PORT = 2014; 
	public static final int LISTENED_PORT = 2013; 
	

	public static void main(String[] args) {		

		try {	
			boolean request;
			boolean accepted;
			
/*---------------------------------------------------------------------------------------*/
/*Attente et réception d'un message------------------------------------------------------*/	
			DatagramSocket mySocketEcoute;
			byte[] recvData;
			DatagramPacket myPacket;
			
			
			mySocketEcoute = new DatagramSocket(LISTENED_PORT);
			int size = mySocketEcoute.getReceiveBufferSize(); //récupère taille buffer réception
			recvData = new byte[size];
			myPacket = new DatagramPacket(recvData, recvData.length);
			mySocketEcoute.receive(myPacket);

			System.out.println("Attente d'un message\n");
			
			Message recvMessage = MessagesFactory.getMessage(myPacket.getData());

			System.out.println("Un message a été reçu");
			System.out.println("Le message est du type " + recvMessage.getClass());
			System.out.println("Il vient de " + recvMessage.getUsername() + "@" + recvMessage.getHostName());

			if (recvMessage instanceof Hello) {
				if (((Hello)recvMessage).getWaitAck()) {
					System.out.println("L'application distante attend un ack\n");
				}
				else {
					System.out.println("L'application distante n'attend pas de ack\n");
				}
			}
			else if (recvMessage instanceof ChatMessage){
				System.out.println("Le message suivant a été reçu :");
				System.out.println(recvMessage.getUsername() + "@" + recvMessage.getHostName() + " : " + ((ChatMessage)recvMessage).getMsgToSend());
			}
/*
/*--------------------------------------------------------------------------------------*/
/*Emission d'un Hello demandant PAS un ack -------------------------------------------------*/	
			//mySocket = null;
			DatagramSocket mySocketEnvoi;
			byte[] myHelloAck;
			
			System.out.println("Envoi d'un HelloAck");
			
			myHelloAck = MessagesFactory.getHello("DonDiegoDeLaVega", false);
			
			mySocketEnvoi = new DatagramSocket();
			mySocketEnvoi.send(new DatagramPacket(myHelloAck, myHelloAck.length, 
										      InetAddress.getByName(recvMessage.getHostName()), DEST_PORT));
			
			System.out.println("HelloAck envoyé\n");
			
/*---------------------------------------------------------------------------------------*/
/*Attente et réception d'un message peut-etre d'un ChatMessage, qui sait ...------------*/	
			//mySocket=null;
			recvData = null;
			myPacket=null;
						
			//mySocket = new DatagramSocket(12345);
			size = mySocketEcoute.getReceiveBufferSize(); //récupère taille buffer réception
			System.out.println("j'ai reçu qq chose");
			recvData = new byte[size];
			myPacket = new DatagramPacket(recvData, recvData.length);
			System.out.println("extraction packet");
			mySocketEcoute.receive(myPacket);
			System.out.println("Attente d'un message\n");
			recvMessage = MessagesFactory.getMessage(myPacket.getData());
			System.out.println("Un message a été reçu");
			System.out.println("Le message est du type " + recvMessage.getClass());
			System.out.println("Il vient de " + recvMessage.getUsername() + "@" + recvMessage.getHostName());

			if (recvMessage instanceof Hello) {
				if (((Hello)recvMessage).getWaitAck()) {
					System.out.println("L'application distante attend un ack\n");
				}
				else {
					System.out.println("L'application distante n'attend pas de ack\n");
				}
			}
			else if (recvMessage instanceof ChatMessage){
				System.out.println("Le message suivant a été reçu :");
				System.out.println(recvMessage.getUsername() + "@" + recvMessage.getHostName() + " : " + ((ChatMessage)recvMessage).getMsgToSend());
			}
			
			
/*---------------------------------------------------------------------------------------*/
/*Emmission d'un ChatMessage-------------------------------------------------------------*/
			mySocketEnvoi = null;
			byte[] myChatMessageByteArray;
			System.out.println("Envoi d'un message");
			
			mySocketEnvoi = new DatagramSocket();
			myChatMessageByteArray = MessagesFactory.getChatMessage("DonDiegoDeLaVega", "Je crois que oui Sergent");
			mySocketEnvoi.send(new DatagramPacket(myChatMessageByteArray,
					myChatMessageByteArray.length,InetAddress.getByName(recvMessage.getHostName()), DEST_PORT));
			
			System.out.println("Message envoyé !!");
			
			
/*---------------------------------------------------------------------------------------*/
/*Attente et réception d'une demande de reception de fichier-----------------------------*/	
			
			recvData = null;
			myPacket=null;

			size = mySocketEcoute.getReceiveBufferSize(); //récupère taille buffer réception
			System.out.println("j'ai reçu qq chose");
			recvData = new byte[size];
			myPacket = new DatagramPacket(recvData, recvData.length);
			System.out.println("extraction paquet");
			mySocketEcoute.receive(myPacket);
			System.out.println("Attente d'un message\n");
			recvMessage = MessagesFactory.getMessage(myPacket.getData());
			System.out.println("Un message à été reçu");
			System.out.println("Le message est du type " + recvMessage.getClass());
			System.out.println("Il vient de " + recvMessage.getUsername() + "@" + recvMessage.getHostName());

			if (recvMessage instanceof Hello) {
				if (((Hello)recvMessage).getWaitAck()) {
					System.out.println("L'application distante attend un ack\n");
				}
				else {
					System.out.println("L'application distante n'attend pas de ack\n");
				}
			}
			else if (recvMessage instanceof ChatMessage){
				System.out.println("Le message suivant a été reçu :");
				System.out.println(recvMessage.getUsername() + "@" + recvMessage.getHostName() + " : " + ((ChatMessage)recvMessage).getMsgToSend());
			}
			else if (recvMessage instanceof FileNotif){
				/*-------------------------------------
				 * On reçoit une demande de fichier----
				 -------------------------------------*/
				if (((FileNotif)recvMessage).getRequest() == true){
					System.out.println(recvMessage.getUsername() + "@" + recvMessage.getHostName() + " souhaite vous envoyez le fichier suivant : " + 
							((FileNotif)recvMessage).getNameFile() + " voulez-vous l'accepter ?");
					request=false;
					accepted = true;
					/*-------------------------------------
					 * On accepte le fichier---------------
					 -------------------------------------*/
					mySocketEnvoi = null;
					String nomFicher = ((FileNotif)recvMessage).getNameFile();
					byte[] myFileNotifByteArray;
					System.out.println("envoi d'une acceptation de reception");
					
					mySocketEnvoi = new DatagramSocket();
					myFileNotifByteArray = MessagesFactory.getFileNotif("DonDiegoDeLaVega", nomFicher, request, accepted);
					mySocketEnvoi.send(new DatagramPacket(myFileNotifByteArray,
							myFileNotifByteArray.length,InetAddress.getByName(recvMessage.getHostName()), DEST_PORT));
					System.out.println("Acceptation envoyée !!");
					
				}
				else if (((FileNotif)recvMessage).getRequest() == true){
					System.out.println(recvMessage.getUsername() + "@" + recvMessage.getHostName() + " souhaite vous envoyez le fichier suivant : " + 
							((FileNotif)recvMessage).getNameFile() + " voulez-vous l'accepter ?");
					request=false;
					accepted = false;
					/*-------------------------------------
					 * On refuse le fichier---------------
					 -------------------------------------*/
					mySocketEnvoi = null;
					String nomFicher = ((FileNotif)recvMessage).getNameFile();
					byte[] myFileNotifByteArray;
					System.out.println("envoi d'une acceptation de reception");
					
					mySocketEnvoi = new DatagramSocket();
					myFileNotifByteArray = MessagesFactory.getFileNotif("DonDiegoDeLaVega", nomFicher, request, accepted);
					mySocketEnvoi.send(new DatagramPacket(myFileNotifByteArray,
							myFileNotifByteArray.length,InetAddress.getByName(recvMessage.getHostName()), DEST_PORT));
					System.out.println("Acceptation envoyée !!");
					
				}
				/*-------------------------------------
				 * On reçoit un acceptation de fichier-
				 -------------------------------------*/
				else if ((((FileNotif)recvMessage).getRequest() == false) && ((((FileNotif)recvMessage).getAccepted() == true))){
					System.out.println("Le fichier a était accepté il va s'envoyer !");
					
				}
			}
			
			
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (MessageCreationException e) {
			e.printStackTrace();
		} 
		

	}
}